package top.chmin.project.cloud.common.code.template.auto;

import org.springframework.stereotype.Repository;
import top.chmin.project.cloud.common.dao.BaseDao;
import top.chmin.project.cloud.common.entity.Condition;
import top.chmin.project.cloud.common.entity.Page;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * chmin
 * 2023-12-27 19:56:45
 * cloud-builder
 */
@Repository
public class CodeTemplateDao extends BaseDao<CodeTemplate> {

    @Override
    public int save(CodeTemplate model) {
        StringBuilder sb = new StringBuilder("INSERT INTO cm_code_template(");
// field column auto
// #bind.field.codeName#
        sb.append("code_name,");
// $bind.field.codeName$

// #bind.field.prefix#
        sb.append("prefix,");
// $bind.field.prefix$

// #bind.field.codeDateTimeFormat#
        sb.append("code_date_time_format,");
// $bind.field.codeDateTimeFormat$

// #bind.field.initValue#
        sb.append("init_value,");
// $bind.field.initValue$

// #bind.field.minStep#
        sb.append("min_step,");
// $bind.field.minStep$

// #bind.field.maxStep#
        sb.append("max_step,");
// $bind.field.maxStep$

// #bind.field.fixLength#
        sb.append("fix_length,");
// $bind.field.fixLength$

        sb.append("create_by,update_by,create_time,update_time");
        sb.append(") VALUES (");
// field ? auto
// #bind.field.codeName#
        sb.append("?,"); // code_name
// $bind.field.codeName$

// #bind.field.prefix#
        sb.append("?,"); // prefix
// $bind.field.prefix$

// #bind.field.codeDateTimeFormat#
        sb.append("?,"); // code_date_time_format
// $bind.field.codeDateTimeFormat$

// #bind.field.initValue#
        sb.append("?,"); // init_value
// $bind.field.initValue$

// #bind.field.minStep#
        sb.append("?,"); // min_step
// $bind.field.minStep$

// #bind.field.maxStep#
        sb.append("?,"); // max_step
// $bind.field.maxStep$

// #bind.field.fixLength#
        sb.append("?,"); // fix_length
// $bind.field.fixLength$

        sb.append("?,?,?,?");
        sb.append(")");

        return template.update(sb.toString(),
// field value auto
// #bind.field.codeName#
                model.getCodeName(),
// $bind.field.codeName$

// #bind.field.prefix#
                model.getPrefix(),
// $bind.field.prefix$

// #bind.field.codeDateTimeFormat#
                model.getCodeDateTimeFormat(),
// $bind.field.codeDateTimeFormat$

// #bind.field.initValue#
                model.getInitValue(),
// $bind.field.initValue$

// #bind.field.minStep#
                model.getMinStep(),
// $bind.field.minStep$

// #bind.field.maxStep#
                model.getMaxStep(),
// $bind.field.maxStep$

// #bind.field.fixLength#
                model.getFixLength(),
// $bind.field.fixLength$

                model.getCreateBy(),
                model.getUpdateBy(),
                model.getCreateTime(),
                model.getUpdateTime()
        );
    }

    @Override
    public int save(List<CodeTemplate> list) {
        StringBuilder sb = new StringBuilder("INSERT INTO cm_code_template(");
// field column auto
// #bind.field.codeName#
        sb.append("code_name,");
// $bind.field.codeName$

// #bind.field.prefix#
        sb.append("prefix,");
// $bind.field.prefix$

// #bind.field.codeDateTimeFormat#
        sb.append("code_date_time_format,");
// $bind.field.codeDateTimeFormat$

// #bind.field.initValue#
        sb.append("init_value,");
// $bind.field.initValue$

// #bind.field.minStep#
        sb.append("min_step,");
// $bind.field.minStep$

// #bind.field.maxStep#
        sb.append("max_step,");
// $bind.field.maxStep$

// #bind.field.fixLength#
        sb.append("fix_length,");
// $bind.field.fixLength$

        sb.append("create_by,update_by,create_time,update_time");
        sb.append(") VALUES (");
// field ? auto
// #bind.field.codeName#
        sb.append("?,"); // code_name
// $bind.field.codeName$

// #bind.field.prefix#
        sb.append("?,"); // prefix
// $bind.field.prefix$

// #bind.field.codeDateTimeFormat#
        sb.append("?,"); // code_date_time_format
// $bind.field.codeDateTimeFormat$

// #bind.field.initValue#
        sb.append("?,"); // init_value
// $bind.field.initValue$

// #bind.field.minStep#
        sb.append("?,"); // min_step
// $bind.field.minStep$

// #bind.field.maxStep#
        sb.append("?,"); // max_step
// $bind.field.maxStep$

// #bind.field.fixLength#
        sb.append("?,"); // fix_length
// $bind.field.fixLength$

        sb.append("?,?,?,?");
        sb.append(")");
        return Arrays.stream(template.batchUpdate(sb.toString(),
                list.stream()
                        .map(model -> new Object[]{
// field value auto
// #bind.field.codeName#
                                model.getCodeName(),
// $bind.field.codeName$

// #bind.field.prefix#
                                model.getPrefix(),
// $bind.field.prefix$

// #bind.field.codeDateTimeFormat#
                                model.getCodeDateTimeFormat(),
// $bind.field.codeDateTimeFormat$

// #bind.field.initValue#
                                model.getInitValue(),
// $bind.field.initValue$

// #bind.field.minStep#
                                model.getMinStep(),
// $bind.field.minStep$

// #bind.field.maxStep#
                                model.getMaxStep(),
// $bind.field.maxStep$

// #bind.field.fixLength#
                                model.getFixLength(),
// $bind.field.fixLength$

                                model.getCreateBy(),
                                model.getUpdateBy(),
                                model.getCreateTime(),
                                model.getUpdateTime()
                        })
                        .toList()
        )).sum();
    }

    @Override
    public int updateById(CodeTemplate model) {
        return updateByCondition(model.getPreCondition().forUpdate().id().eq().toCondition());
    }

    @Override
    public int deleteById(Long id) {
        return deleteByCondition(new CodeTemplateFPC().forDelete().id().eq(id).toCondition());
    }

    @Override
    public int deleteById(List<Long> list) {
        return deleteByCondition(new CodeTemplateFPC().forDelete().id().in(list).toCondition());
    }

    @Override
    public CodeTemplate getById(Long id) {
        return getStreamByCondition(new CodeTemplateFPC().id().eq(id).toCondition(), CodeTemplate.class).findFirst().orElse(null);
    }

    @Override
    public List<CodeTemplate> getListById(List<Long> list) {
        return getStreamByCondition(new CodeTemplateFPC().id().in(list).toCondition(), CodeTemplate.class).toList();
    }

    @Override
    public CodeTemplate getFirst(Condition condition) {
        return getFirst(condition, CodeTemplate.class);
    }

    @Override
    public Stream<CodeTemplate> getStreamByCondition(Condition condition) {
        return getStreamByCondition(condition, CodeTemplate.class);
    }

    @Override
    public Page<CodeTemplate> getPageByCondition(Condition condition) {
        return getPageByCondition(condition, CodeTemplate.class);
    }
}
